这一面是提早下班+叫女朋友帮忙送电脑过来,然后在公司附近找了个安静的咖啡厅面试的
可能不是自己熟悉的环境再加上和面试官的网络不是很好
整体的体验就很emmm
应该是凉了,不过也意识到了自己的一些弱点哈哈哈哈
不多说了,直接切入张正题吧
## 1、无向图
头条有 10 个办公点,总部在中航广场,有的办公点之间有摆渡车供员工使用。
1. 摆渡车在两个办公点之间来回摆渡,摆渡车的路线是已知的。一鸣从总部出发,能否在不回到总部的情况下通过摆渡车参观完所有办公点?
2. 摆渡车在两个办公点之间来回摆渡,不同办公点之间花费的时间是已知的且不同。设计一个摆渡车路线,要求:
1. 员工能通过换乘从一个办公点到达任意一个办公点
2. 使用的摆渡车数量尽可能少
3. 各摆渡车路线的总时间尽可能少
其实吧就是两个无向图的题。但是我个人真的图相关的题目做的太少了。做的慢,而第二题也没完全实现。
思路如下:第一题为广度遍历,第二题为最小生成树。其实第二题的二三问我有点不太理解,他们不应该会有个优先级么?
```java
// 第一题
private static boolean visist(Node start){
if(start == null) return false;
Set<Node> visited = new HashSet<>();
Deque<Node> queue = new ArrayDeque<>();
queue.addLast(start);
// 广度遍历
while(!queue.isEmpty()){
Node next = queue.pollFirst();
visited.add(next);
for(Node node: next){
// 不回到总部
if(next != start) queue.addLast(node);
}
}
return visited.size() == 10;
}
```
正好趁着面经的时候来复习一下最小生成树。
### 最小生成树
+ **生成树:** 一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
+ **最小生成树:** 在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
```java
// 第二题
明天上班补充一下
```
## 2、虚拟内存
这个应该没有什么悬念吧,结合分页技术可以提高程序可用内存空间
> [百度百科-虚拟内存](https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98/101812?fr=aladdin)
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。
## 3、反射
他问我反射是怎么实现的,我其实是有点懵逼的
因为我只知道反射是个什么东西,但是我不知道是怎么做到反射的
回答原理吗?我不太懂
如果是问我如何去实现一个反射,那么步骤大概如下
1. 获取到想要的对象的Class对象。Class对象是类加载进JVM之后就会一直维护的一个对象,可以说是一个类存在于JVM的标志。可以通过Class.forName()、str.getClass()、String.class等方法来获取Class对象
2. 通过Class对象对类进行一系列的操作,包括调用构造器、创建新的类的实例、调用类的静态方法、访问类的域和方法等。
我搜了一下好像没有讲到Java到底是怎么具体实现反射的,最深只讲到了Method的invoke方法的源码,有兴趣的可以去参考一下
> [大白话说Java反射:入门、使用、原理](https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html)
【秋招面经】字节跳动-秋招提前批-深圳后端工程师 二面面经